import 'package:flutter/material.dart';
import 'package:flutter_09_game/config/app_color.dart';
import 'package:flutter_09_game/generated/locales.g.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fl_chart/fl_chart.dart';
import 'package:get/get.dart';

/// 资金记录柱状图组件
/// 使用fl_chart实现，严格按照Figma设计图样式
class WidgetRecordChart extends StatelessWidget {
  final int totalBetAmount;
  final int amount;
  final double height;

  const WidgetRecordChart({
    super.key,
    required this.totalBetAmount,
    required this.amount,
    this.height = 231,
  });

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        // 主要柱状图区域
        SizedBox(
          height: height.w,
          child: _buildBarChart(),
        ),
        10.verticalSpaceFromWidth,
        // 底部图例
        _buildLegend().marginOnly(left: 44.w),
      ],
    );
  }

  /// 构建fl_chart柱状图
  Widget _buildBarChart() {
    final maxYValue = _calculateMaxY();
    final interval = _calculateInterval(maxYValue);

    return BarChart(
      BarChartData(
        maxY: maxYValue,
        minY: 0,
        barTouchData: BarTouchData(enabled: false),
        titlesData: FlTitlesData(
          show: true,
          rightTitles:
              const AxisTitles(sideTitles: SideTitles(showTitles: false)),
          topTitles:
              const AxisTitles(sideTitles: SideTitles(showTitles: false)),
          bottomTitles:
              const AxisTitles(sideTitles: SideTitles(showTitles: false)),
          leftTitles: AxisTitles(
            sideTitles: SideTitles(
              showTitles: true,
              reservedSize: 44.w,
              getTitlesWidget: (value, meta) {
                return Text(
                  value.toInt().toString(),
                  style: TextStyle(
                    fontSize: 10.sp,
                    color: AppColor.textPrimary.withOpacity(0.7),
                  ),
                );
              },
              interval: interval,
            ),
          ),
        ),
        borderData: FlBorderData(show: false),
        gridData: const FlGridData(show: false),
        backgroundColor: Colors.transparent,
        barGroups: _buildBarGroups(),
        extraLinesData: ExtraLinesData(
          horizontalLines: [
            // 添加红色虚线参考线（如果有亏损数据）
            if (amount < 0)
              HorizontalLine(
                y: amount.abs().toDouble(),
                color: AppColor.gameErrorColor,
                strokeWidth: 1.w,
                dashArray: [4, 4],
              ),

            // 添加绿色虚线参考线（如果有盈利数据）
            if (amount > 0)
              HorizontalLine(
                y: amount.toDouble(),
                color: const Color(0xFF02DB7F),
                strokeWidth: 1.w,
                dashArray: [4, 4],
              ),
          ],
        ),
      ),
    );
  }

  /// 计算合适的Y轴最大值
  /// 规则：
  /// - 固定显示5个刻度（0到maxY，共5个刻度点）
  /// - 根据数据最大值计算合适的间隔，确保数据能完整显示
  /// - maxY = interval × 4（5个刻度，4个间隔）
  double _calculateMaxY() {
    // 获取所有数据的最大值
    final betAmount = totalBetAmount.abs();
    final amountAbs = amount.abs();
    final maxDataValue = [betAmount, amountAbs].reduce((a, b) => a > b ? a : b);

    // 无数据时返回40（5个刻度：0,10,20,30,40）
    if (maxDataValue == 0) return 40;

    // 计算合适的间隔值，确保5个刻度能包含所有数据
    double interval = _calculateOptimalInterval(maxDataValue.toDouble());

    // 返回maxY = interval × 4（5个刻度，4个间隔）
    return interval * 4;
  }

  /// 计算最优间隔值
  /// 让数据占据图表约80%的高度，提供适当的视觉留白
  /// 例如：870000 → 1000000刻度，34000 → 40000刻度
  double _calculateOptimalInterval(double maxDataValue) {
    // 根据数据量级选择合适的刻度候选值
    List<double> candidates = _getScaleCandidates(maxDataValue);

    // 找到第一个能让数据占据60%-90%高度的候选值
    for (double candidate in candidates) {
      double dataRatio = maxDataValue / candidate;
      if (dataRatio >= 0.6 && dataRatio <= 0.9) {
        return candidate / 4; // 返回间隔值（5个刻度，4个间隔）
      }
    }

    // 如果没有找到合适的比例，选择第一个大于数据的候选值
    for (double candidate in candidates) {
      if (candidate > maxDataValue) {
        return candidate / 4;
      }
    }

    // 如果所有候选值都小于数据，使用最大的候选值
    return candidates.last / 4;
  }

  /// 根据数据量级获取刻度候选值
  /// 确保选择的刻度值美观且易读
  /// 基于用户例子：870000→100000, 34000→40000
  List<double> _getScaleCandidates(double maxDataValue) {
    if (maxDataValue <= 1000) {
      // 小数值：使用较小的刻度单位
      return [40.0, 80.0, 100.0, 200.0, 400.0, 500.0, 800.0, 1000.0];
    } else if (maxDataValue <= 10000) {
      // 中小数值：使用千位刻度
      return [2000.0, 4000.0, 5000.0, 8000.0, 10000.0, 20000.0];
    } else if (maxDataValue <= 100000) {
      // 中数值：使用万位刻度（34000→40000）
      return [20000.0, 40000.0, 50000.0, 80000.0, 100000.0];
    } else if (maxDataValue <= 1000000) {
      // 大数值：使用十万位刻度（870000→1000000）
      // 注意：根据用户例子，可能倾向于选择较小的刻度以获得更好的视觉效果
      return [
        100000.0,
        200000.0,
        400000.0,
        500000.0,
        800000.0,
        1000000.0,
        2000000.0
      ];
    } else {
      // 超大数值：使用百万位刻度
      return [
        1000000.0,
        2000000.0,
        4000000.0,
        5000000.0,
        8000000.0,
        10000000.0
      ];
    }
  }

  /// 计算合适的Y轴刻度间隔
  /// 规则：
  /// - 固定5个刻度，间隔 = maxY / 4
  /// - 与_calculateMaxY方法配合使用
  double _calculateInterval(double maxY) {
    // 由于maxY已经是interval * 4，所以间隔就是maxY / 4
    return maxY / 4;
  }

  /// 构建柱状图数据组
  List<BarChartGroupData> _buildBarGroups() {
    final maxYValue = _calculateMaxY();

    // 计算三个数据值
    final betAmount = totalBetAmount.toDouble();
    final profitAmount = amount >= 0 ? amount.toDouble() : 0.0;
    final lossAmount = amount < 0 ? amount.abs().toDouble() : 0.0;

    return [
      // 总投注柱状图
      BarChartGroupData(
        x: 0,
        barRods: [
          BarChartRodData(
            toY: betAmount > maxYValue ? maxYValue : betAmount,
            width: 68.w,
            borderRadius: BorderRadius.circular(12.w),
            gradient: const LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
              colors: [
                Color(0xFF0018BB), // 蓝色渐变起始
                Color(0xFF00BBFF), // 蓝色渐变结束
              ],
            ),
          ),
        ],
      ),
      // 总盈利柱状图（绿色）
      BarChartGroupData(
        x: 1,
        barRods: [
          BarChartRodData(
            toY: profitAmount > maxYValue ? maxYValue : profitAmount,
            width: 68.w,
            borderRadius: BorderRadius.circular(12.w),
            gradient: const LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
              colors: [
                Color(0xFF02DB7F), // 绿色渐变起始
                Color(0xFF00FF78), // 绿色渐变结束
              ],
            ),
          ),
        ],
      ),
      // 总亏损柱状图（红色）
      BarChartGroupData(
        x: 2,
        barRods: [
          BarChartRodData(
            toY: lossAmount > maxYValue ? maxYValue : lossAmount,
            width: 68.w,
            borderRadius: BorderRadius.circular(12.w),
            gradient: const LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
              colors: [
                Color(0xFFED474B), // 红色渐变起始
                Color(0xFFFF6B6B), // 红色渐变结束
              ],
            ),
          ),
        ],
      ),
    ];
  }

  /// 构建底部图例
  Widget _buildLegend() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [
        _buildLegendItem(
          LocaleKeys.totalBets.tr,
        ),
        _buildLegendItem(
          LocaleKeys.totalProfit.tr,
        ),
        _buildLegendItem(
          LocaleKeys.totalLoss.tr,
        ),
      ],
    );
  }

  /// 构建单个图例项
  Widget _buildLegendItem(String label) {
    return SizedBox(
      width: 68.w,
      child: Text(
        label,
        textAlign: TextAlign.center,
        style: TextStyle(
          fontSize: 12.sp,
          color: AppColor.textPrimary.withOpacity(0.7),
        ),
      ),
    );
  }
}
